package com.ikun.common.manager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author ximeng
 * @title: RedisManager
 * @projectName iot-fy-2301-parent
 * @description: 操作redis数据库
 * @date 2023/10/17  15:57
 */
@Component
public class RedisManager {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 向String类型中写入数据
     *
     * @param key
     * @param val
     * @param expireTime
     * @param timeUnit
     */
    public void addString(String key, String val, long expireTime, TimeUnit timeUnit) {
        stringRedisTemplate.opsForValue().set(key, val, expireTime, timeUnit);
    }

    /**
     *
     * @param key
     * @param val
     */
    public void addString(String key, String val) {
        stringRedisTemplate.opsForValue().set(key, val);
    }

    /**
     * 这个是从String类型中获取数据
     * @param key
     * @return
     */
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 根据key删除数据
     * @param keys
     */
    public void remove(String... keys) {
        stringRedisTemplate.delete(Arrays.asList(keys));
    }

    /**
     * 向ZSet(SortedSet)中添加数据
     * @param key
     * @param score
     * @param val
     */
    public void addZSet(String key, long score, String val) {
        redisTemplate.opsForZSet().add(key, val, score);
    }

    /**
     * 统计ZSet中在指定分数区间内的键值对的数量
     * @param key
     * @param startScore
     * @param endScore
     * @return
     */
    public long countZSetByScore(String key, long startScore, long endScore) {
        return redisTemplate.opsForZSet().count(key, startScore, endScore);
    }

    /**
     * 获取zset集合中得分指定排名区间的数据
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> getTopFromZSet(String key, long start, long end) {
        return redisTemplate.opsForZSet().reverseRange(key, start, end);
    }

    /**
     * 判断这个key是否存在
     * @param key
     * @return
     */
    public boolean existsKey(String key) {
        return redisTemplate.hasKey(key);
    }


    /**
     * 查询所有的key
     * @param likeKey
     * @return
     */
    public Set<String> getLikeKeys(String likeKey) {
        Set<String> keys = redisTemplate.keys(likeKey);
        return keys;
    }


    /**
     * 这个是Set集合中放数据
     * @param key
     * @param val
     */
    public void addSet(String key, String val) {
        redisTemplate.opsForSet().add(key, val);
    }

    /**
     * 从Set集合获取数据
     * @param key
     * @return
     */
    public Set<String> getSetVal(String key) {
        Set<String> members = redisTemplate.opsForSet().members(key);
        return members;
    }

    /**
     * 通过得分区间获取我们的成员
     * @param key
     * @param startScore
     * @param endScore
     * @return
     */
    public Set getZSetScore(String key, long startScore, long endScore) {
        return redisTemplate.opsForZSet().rangeByScore(key, startScore, endScore);
    }


    /**
     * 通过值删除这个ZSet集合中的成员
     * @param key
     * @param val
     */
    public void removeZset(String key, String val) {
        redisTemplate.opsForZSet().remove(key, val);
    }

    /**
     * 通过值删除这个Set集合中的成员
     * @param key
     * @param val
     */
    public void removeSet(String key, String val) {
        redisTemplate.opsForSet().remove(key, val);
    }

    /**
     * 向Hash结构中添加心跳信息
     * @param keyName
     * @param deviceKey
     * @param currentTimeMillis
     */
    public void addHash(String keyName, String deviceKey, long currentTimeMillis) {
        redisTemplate.opsForHash().put(keyName, deviceKey, currentTimeMillis);
    }

    /**
     * 获取指定名称中的这个Hash结构中的所有的值
     * @param keyName
     * @return
     */
    public Map<String, Object> getHashList(String keyName) {
        return redisTemplate.opsForHash().entries(keyName);
    }

    /**
     * 删除Hash结构中某一个key
     * @param name
     * @param key
     */
    public void removeHash(String name, String... key) {
        redisTemplate.opsForHash().delete(name, key);
    }

    /**
     * 向List结构中添加数据
     *   这里要用到lpush这个命令
     * @param name
     * @param val
     */
    public void addList(String name, String val) {
        redisTemplate.opsForList().leftPush(name, val);
    }

    /**
     * 获取指定list集合的所有数据
     * @param key
     * @return
     */
    public List<String> getList(String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    /**
     * 获取指定区间的数据
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<String> getList(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

    /**
     * 获取List中数据的条目数
     * @param name
     * @return
     */
    public long getListLength(String name) {
        return redisTemplate.opsForList().size(name);
    }

    /**
     * 从右侧删除List中的数据
     * @param name
     */
    public void removeFromRightList(String name) {
        redisTemplate.opsForList().rightPop(name);
    }

    /**
     * 获取指定前缀的keys
     * @param prefixKey
     */
    public Set<String> keys(String prefixKey) {
        return redisTemplate.keys(prefixKey);
    }
}
